/* 
    接着我们要看两个跟时间有关的operators，在JS 中我们可以用 setInterval 来建立一个持续的行为，这也能用在Observable 中
*/

var source = Rx.Observable.create(function(observer) {
    var i = 0;
    setInterval(() => {
        observer.next(i++);
    }, 1000)
});

source.subscribe({
	next: function(value) {
		console.log(value)
	},
	complete: function() {
		console.log('complete!');
	},
	error: function(error) {
    console.log('Throw Error: ' + error)
	}
});
// 0
// 1
// 2
// .....

/* 
    上面这段程式码，会每隔一秒送出一个从零开始递增的整数，在Observable 的世界也有一个operator 可以更方便地做到这件事，就是 interval
    interval有一个参数必须是数值(Number)，这的数值代表发出讯号的间隔时间(ms)。这两段程式码基本上是等价的，会持续每隔一秒送出一个从零开始递增的数值！
*/

// 另外有一个很相似的operator 叫timer，timer可以给两个参数，范例如下
var source2 = Rx.Observable.timer(1000, 5000);

source2.subscribe({
	next: function(value) {
		console.log(value)
	},
	complete: function() {
		console.log('complete!');
	},
	error: function(error) {
    console.log('Throw Error: ' + error)
	}
});
// 0
// 1
// 2 ...

/* 
    当 timer 有两个参数时，第一个参数代表要发出第一个值的等待时间(ms)，第二个参数代表第一次之后发送值的间隔时间，
    所以上面这段程式码会先等一秒送出0 之后每五秒送出1, 2, 3, 4...。
    timer 第一个参数除了可以是数值(Number)之外，也可以是日期(Date)，就会等到指定的时间在发送第一个值。
    另外 timer 也可以只接收一个参数
*/

var source3 = Rx.Observable.timer(1000);

source3.subscribe({
	next: function(value) {
		console.log(value)
	},
	complete: function() {
		console.log('complete!');
	},
	error: function(error) {
    console.log('Throw Error: ' + error)
	}
});
// 0
// complete!
// 上面这段程式码就会等一秒后送出1 同时通知结束。